/******************************************************
 * Cours: LOG121
 * Session: A2012
 * Groupe: 01 Projet: Laboratoire #2
 * Étudiant(e)s: Guillaume Boulay
 *               Raphael Faucher
 * Professeur et chargé de labo : Patrice Boucher
 * Nom du fichier: TestDice.java
 * Date crée: 2012-11-19
 ******************************************************* 
 * Historique des modifications
 ******************************************************* 
 * 2012-11-19 Version initiale (Guillaume Boulay)
 *******************************************************/
import junit.framework.*;

public class TestDice extends TestCase
{
    /**
     * S'assure que Dice.roll() fonctionne et ne redonne pas toujours le même
     * nombre.
     */
    public void testDiceRandomness()
    {
        Dice dice = new Dice(10);
        boolean isRandom = false;
        int value = dice.roll();
        
        for (int i = 0; i < 100; i++) {
            if (value != dice.roll()) {
                isRandom = true;
                break;
            }
        }
        
        assertTrue(isRandom);
    }
    
    /**
     * S'assure que Dice.roll() et Dice.getValue() on tout les deux la même 
     * valeur.
     */
    public void testDiceRollAndGetValue()
    {
        Dice dice = new Dice(6);
        int value = 0;
        
        for (int i = 0; i < 100; i++) {
            value = dice.roll();
            assertTrue(value == dice.getValue());
        }
    }
    
    /**
     * S'assure que Dice.roll() est inclue entre [1, n] en faisant
     * 1000 dice.roll().
     */
    public void testDiceRandomnessIsInBound()
    {
        int n = 6;
        
        /* Le but étant de savoir, si dans les 1000 tests, le dé tombe sur
         * n au moins une fois. */
        boolean isMax = false;
        
        Dice dice = new Dice(n);
        
        assertTrue(dice.getFaces() == n);
        
        /* dice.roll() doit donner un nombre entre [1, n] */
        for (int i = 0; i < 1000; i++) {
            assertTrue(dice.roll() >= 1);
            assertTrue(dice.getValue() <= n);
            
            /* Est-ce qu'on tombe au moins une fois sur n? */
            if (dice.getValue() == n)
                isMax = true;
        }
        
        /* On fait le test pour s'assurer qu'on est tomber au moins une fois
         * sur n. Les chances qu'il n'arrive pas sur n au moins une fois 
         * sur 1000 sont très faible. */
        assertTrue(isMax);
    }
    
    /**
     * S'assure que Dice.roll() est inclue entre [1, n] en faisant
     * 1000 dice.roll() après avoir changé n.
     */
    public void testDiceChangeFacesIsInBounds()
    {
        int n = 14;
        Dice dice = new Dice(n);
        
        assertTrue(dice.getFaces() == n);
        
        n = 6;
        dice.setFaces(n);
        
        /* dice.roll() doit donner un nombre entre [1, n] */
        for (int i = 0; i < 1000; i++) {
            assertTrue(dice.roll() >= 1);
            assertTrue(dice.getValue() <= n);
        }
    }
    
    /**
     * S'assure que Dice.compareTo(Dice) fonctionne bien en faisaint 1000 tests
     * avec de nouveau Dice.roll() à chaque fois.
     */
    public void testDiceCompareTo()
    {
        Dice dice = new Dice(6);
        Dice diceTwo = new Dice(15);
        
        for (int i = 0; i < 1000; i++) {
            dice.roll();
            diceTwo.roll();
        
            if (dice.compareTo(diceTwo) == 0) {
                assertTrue(dice.getValue() == diceTwo.getValue());
            } else if (dice.compareTo(diceTwo) < 0) {
                assertTrue(dice.getValue() < diceTwo.getValue());
            } else {
                assertTrue(dice.getValue() > diceTwo.getValue());
            }
        }
    }
}
